function user_subcarriers = allocate_subcarriers(num_users, num_subcarriers, ...
    subcarriers_per_user, allocation_type)
% allocate_subcarriers - 为OFDMA系统中的用户分配子载波
%
% 输入参数:
%   num_users           - 用户数量
%   num_subcarriers     - 系统总子载波数
%   subcarriers_per_user - 每个用户分配的子载波数
%   allocation_type     - 分配类型: 'contiguous' 或 'distributed'
%
% 输出参数:
%   user_subcarriers - 元胞数组，每个元素包含分配给一个用户的子载波索引

% 检查参数有效性
total_required = num_users * subcarriers_per_user;
if total_required > num_subcarriers
    error('分配的子载波总数超过系统可用子载波数！');
end

% 初始化用户子载波分配
user_subcarriers = cell(num_users, 1);

% 根据分配类型选择不同的分配策略
switch lower(allocation_type)
    case 'contiguous'
        % 连续分配 - 每个用户获得连续的子载波块
        % 这是LTE中资源块(RB)分配的简化版本
        
        % 确定每个用户的起始子载波
        start_indices = 1 + (0:num_users-1) * subcarriers_per_user;
        
        for user = 1:num_users
            start_idx = start_indices(user);
            end_idx = start_idx + subcarriers_per_user - 1;
            
            % 确保不超过总子载波数
            end_idx = min(end_idx, num_subcarriers);
            
            % 分配子载波
            user_subcarriers{user} = start_idx:end_idx;
        end
        
    case 'distributed'
        % 分布式分配 - 将子载波分散分配给用户
        % 这类似于OFDMA系统中的PUSC (Partially Used Subcarrier)
        
        % 创建所有可用子载波的索引
        all_subcarriers = 1:num_subcarriers;
        
        % 打乱子载波顺序以模拟频率多样性
        rng(0);  % 固定随机种子以便结果可重现
        shuffled_subcarriers = all_subcarriers(randperm(num_subcarriers));
        
        % 为每个用户分配子载波
        for user = 1:num_users
            start_idx = 1 + (user-1) * subcarriers_per_user;
            end_idx = start_idx + subcarriers_per_user - 1;
            
            % 确保不超过洗牌后的子载波索引范围
            end_idx = min(end_idx, length(shuffled_subcarriers));
            
            % 分配子载波
            user_subcarriers{user} = shuffled_subcarriers(start_idx:end_idx);
            
            % 对分配的子载波索引进行排序，便于后续处理
            user_subcarriers{user} = sort(user_subcarriers{user});
        end
        
    otherwise
        error('不支持的分配类型: %s', allocation_type);
end

% 输出每个用户的子载波分配情况
for user = 1:num_users
    fprintf('用户 %d 分配了 %d 个子载波\n', user, length(user_subcarriers{user}));
end

end 